import "code.google.com/p/go.net/websocket"
websocket包实现了WebSocket协议的客户端和服务端,参见RFC 6455。
const (
ProtocolVersionHybi13 = 13
ProtocolVersionHybi = ProtocolVersionHybi13
SupportedProtocolVersion = "13"
ContinuationFrame = 0
TextFrame = 1
BinaryFrame = 2
CloseFrame = 8
PingFrame = 9
PongFrame = 10
UnknownFrame = 255
)
var (
ErrBadMaskingKey = &ProtocolError{"bad masking key"}
ErrBadPongMessage = &ProtocolError{"bad pong message"}
ErrBadClosingStatus = &ProtocolError{"bad closing status"}
ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"}
ErrNotImplemented = &ProtocolError{"not implemented"}
)
var (
ErrBadProtocolVersion = &ProtocolError{"bad protocol version"}
ErrBadScheme = &ProtocolError{"bad scheme"}
ErrBadStatus = &ProtocolError{"bad status"}
ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"}
ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"}
ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"}
ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"}
ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"}
ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"}
ErrBadFrame = &ProtocolError{"bad frame"}
ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"}
ErrNotWebSocket = &ProtocolError{"not websocket protocol"}
ErrBadRequestMethod = &ProtocolError{"bad method"}
ErrNotSupported = &ProtocolError{"not supported"}
)
var JSON = Codec{jsonMarshal, jsonUnmarshal}
JSON是从WebSocket连接中发送/接受json数据的编解码器。
简单用法举例:
import "websocket"
type T struct {
Msg string
Count int
}
// receive JSON type T
var data T
websocket.JSON.Receive(ws, &data)
// send JSON type T
websocket.JSON.Send(ws, data)
var Message = Codec{marshal, unmarshal}
Message是从WebSocket连接中发送/接受文本和二进制数据的编解码器。要发送/接收文本数据,应使用string类型;要发送/接收二进制数据,应使用[]byte类型。
简单用法举例:
import "websocket"
// receive text frame
var message string
websocket.Message.Receive(ws, &message)
// send text frame
message = "hello"
websocket.Message.Send(ws, message)
// receive binary frame
var data []byte
websocket.Message.Receive(ws, &data)
// send binary frame
data = []byte{0, 1, 2}
websocket.Message.Send(ws, data)
type ProtocolError struct {
ErrorString string
}
ProtocolError代表WebSocket协议错误。
func (err *ProtocolError) Error() string
type DialError struct {
*Config
Err error
}
DialError代表与WebSocket服务端建立连接时出现的错误。
func (e *DialError) Error() string
func Origin(config *Config, req *http.Request) (*url.URL, error)
Origin解析req的头域的Origin头,如果没有该头,会返回(nil, nil)。
type Config struct {
// WebSocket服务端的地址
Location *url.URL
// Websocket客户端的起点
Origin *url.URL
// WebSocket的子协议
Protocol []string
// WebSocket协议的版本
Version int
// 安全WebSocket(wss)的TLS配置
TlsConfig *tls.Config
// 启用WebSocket的握手应额外发送的头域
Header http.Header
// 内含隐藏或非导出字段
}
Config代表一个WebSocket配置。
func NewConfig(server, origin string) (config *Config, err error)
NewConfig创建一个用于客户端连接的新WebSocket配置。
type Addr struct {
*url.URL
}
Addr实现了net.Addr接口,用于WebSocket。
func (addr *Addr) Network() string
Network返回WebSocket的网络类型:"websocket"。
type Conn struct {
PayloadType byte
// 内含隐藏或非导出字段
}
Conn代表一个WebSocket连接。
func Dial(url_, protocol, origin string) (ws *Conn, err error)
Dial打开一个新的WebSocket的客户端连接。
origin := "http://localhost/"
url := "ws://localhost:12345/ws"
ws, err := websocket.Dial(url, "", origin)
if err != nil {
log.Fatal(err)
}
if _, err := ws.Write([]byte("hello, world!\n")); err != nil {
log.Fatal(err)
}
var msg = make([]byte, 512)
var n int
if n, err = ws.Read(msg); err != nil {
log.Fatal(err)
}
fmt.Printf("Received: %s.\n", msg[:n])
func DialConfig(config *Config) (ws *Conn, err error)
DialConfig使用配置config打开一个新的WebSocket的客户端连接。
func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error)
NewClient使用配置config通过包装rwc接口创建一个新的WebSocket的客户端连接。
func (ws *Conn) IsClientConn() bool
func (ws *Conn) IsServerConn() bool
func (ws *Conn) LocalAddr() net.Addr
LocalAddr在客户端会返回配置的Origin字段值,在服务端会返回配置的Location字段值。
func (ws *Conn) RemoteAddr() net.Addr
RemoteAddr在客户端会返回配置的Location字段值,在服务端会返回配置的Origin字段值。
func (ws *Conn) Config() *Config
Config返回WebSocket的配置。
func (ws *Conn) Request() *http.Request
Request返回升级到WebSocket协议的请求;在客户端,会返回nil。
func (ws *Conn) SetDeadline(t time.Time) error
SetDeadline设置该连接的网络读写期限。
func (ws *Conn) SetReadDeadline(t time.Time) error
SetReadDeadline设置该连接的网络读期限。
func (ws *Conn) SetWriteDeadline(t time.Time) error
SetWriteDeadline设置该连接的网络写期限。
func (ws *Conn) Read(msg []byte) (n int, err error)
Read实现了io.Reader接口:它从WebSocket连接读取框架数据。如果msg不能放入全部框架数据,它会 写满msg,下一次调用Read会写入剩下的框架数据。本方法可以读取文本框架数据和二进制框架数据。
func (ws *Conn) Write(msg []byte) (n int, err error)
Write实现了io.Writer接口:它将数据编码为框架数据写入WebSocket连接。
func (ws *Conn) Close() error
Close实现了io.Closer接口。
type Codec struct {
Marshal func(v interface{}) (data []byte, payloadType byte, err error)
Unmarshal func(data []byte, payloadType byte, v interface{}) (err error)
}
Codec代表一个编解码器,它有两个对称的用于编解码的函数类型字段。
func (cd Codec) Receive(ws *Conn, v interface{}) (err error)
Receive从ws获取单个框架,使用cd.Unmarshal反序列化数据并填充进v。
func (cd Codec) Send(ws *Conn, v interface{}) (err error)
Send使用cd.Marshal将v序列化后编码为单个框架写入ws。
type Server struct {
// Config是建立新WebSocket连接的WebSocket配置。
Config
// Handshake是可选的握手(检验)函数。
// 例如,你可以检查或者不检查请求的Origin头。
// 另一个例子,你可以选择config的协议。
Handshake func(*Config, *http.Request) error
// Handler处理单个WebSocket连接。
Handler
}
Server代表一个WebSocket的服务端。
func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request)
ServeHTTP实现了用于WebSocket连接的http.Handler接口。
type Handler func(*Conn)
Handler是一个简单的服务浏览器WebSocket客户端的接口。它默认会检查请求的Origin头是否是合法的URL。如果你使用Server代替Handler,你可以在Handshake函数类型字段里检查请求的Origin头。因此,如果你想要接受非浏览器的客户端(不发送Origin头),你可以使用Server,它在握手时不会检查Origin。
package websocket_test
import (
"io"
"net/http"
"code.google.com/p/go.net/websocket"
)
// Echo the data received on the WebSocket.
func EchoServer(ws *websocket.Conn) {
io.Copy(ws, ws)
}
// This example demonstrates a trivial echo server.
func ExampleHandler() {
http.Handle("/echo", websocket.Handler(EchoServer))
err := http.ListenAndServe(":12345", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}
func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request)
ServeHTTP实现了用于WebSocket连接的http.Handler接口。